package com.lhl.biz.template.server.manager;

import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.lhl.biz.template.api.shared.domain.dto.TempDTO;
import com.lhl.biz.template.api.shared.domain.dto.TemplateDTO;
import com.lhl.biz.template.api.shared.domain.entity.Template;
import com.lhl.biz.template.api.shared.domain.vo.TemplateVO;
import com.lhl.biz.template.server.dao.TemplateDao;
import com.lhl.biz.template.server.mapstruct.TemplateDtoMapper;
import com.lhl.biz.template.server.mapstruct.TemplateVoMapper;
import com.lhl.biz.template.server.repository.TemplateRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

/**
 * @className: TemplateManager
 * @description: 通用业务处理层，它有如下特征
 * 1） 对第三方平台封装的层，预处理返回结果及转化异常信息。
 * 2） 对 Service 层通用能力的下沉，如缓存方案、中间件通用处理。
 * 3） 与 DAO 层交互，对多个 DAO 的组合复用。
 * @author: king
 * @date: 2020-06-17 13:55
 **/
@Component
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TemplateManager {
    private final TemplateDao templateDao;
    private final TemplateDtoMapper templateDtoMapper;
    private final TemplateVoMapper templateVoMapper;
    private final TemplateRepository templateRepository;

    @Cached(name = "TemplateService.queryById.", key = "#id", expire = 80, cacheType = CacheType.BOTH)
    public Optional<TemplateDTO> queryById(String id) {
        return templateDao.queryById(id);
    }

    public Optional<List<TemplateDTO>> queryByJson(String code) {
        return templateDao.queryByJson(code);
    }

    public Optional<List<TemplateDTO>> queryByName(String name) {
        return templateDao.queryByName(name);
    }

    public Optional<List<TemplateDTO>> findByBirthdayIsGreaterThanEqual(LocalDate birthday) {
        return Optional.ofNullable(templateDtoMapper.toDto(
                templateRepository.findByBirthdayIsGreaterThanEqual(birthday).orElse(null)));
    }

    @Cached(name = "TemplateService.findByName", key = "#name", expire = 3600, cacheType = CacheType.REMOTE)
    public Optional<TempDTO> findByName(String name) {
        log.debug("执行SQL");
        return templateRepository.findByName(name);
    }

    public void save(TemplateVO templateVO) {
        Template template = templateVoMapper.toEntity(templateVO);
        templateRepository.save(template);
    }

    public Optional<TemplateDTO> findById(String id) {
        return Optional.ofNullable(templateDtoMapper.toDto(templateRepository.findById(id).orElse(null)));
    }
}
